#ifndef __BLUETOOTH_H__
#define	__BLUETOOTH_H__

/**
  ******************************************************************************
  * @file           : bluetooth.h
  * @brief          : Header for bluetooth.cpp file.
  *                   This file contains the common defines of the application.
  * @author			: xiaozhi
  * @attention
  *
  *		Copyright (c) 2023 Technology Co., Ltd.
  *
  *******************************************************************************
  */

#ifdef __cplusplus
extern "C" {
#endif

/*
 * macro definition
 */

/* at instruction execute okay */
#define AT_INSTRUCTION_OK		"OK"

/* at instruction execute error */
#define AT_INSTRUCTION_ERROR	"ERROR"

/* function return fail */
#define FAIL		0xFF

/* function return ok */
#define OKAY		0	


/* bluetooth buffer length */
#define BT_BUFFER_LEN			1500

/* command length */
#define BT_INSTRUCTION_LEN	64

#if 1
#define AC_DEBUG
#endif

#ifdef AC_DEBUG
#define ac_traces(msg...) do { \
			printf(msg); \
			printf("\n"); \
	}while(0)
#else
#define ac_traces(msg...)
	
#endif

/* for debug */
#define BT_DEBUG	1

#if (BT_DEBUG == 1)
#define __exhibit(at_instruction)	ac_traces(at_instruction)
#else
#define __exhibit(at_instruction)
#endif


/*
 * 格式说明
 *
 * AT模式下芯片作为串口从设备，与芯片相连的主控(主机)为串口主设备，AT命令由主机发送，芯片给出响应。 

 * 主机发送基本格式： 
 * <AT><+><命令码><操作符><参数><{CR}{LF}> 
 * 说明：基本格式是大部分命令码，部分命令有所区别，具体见下面的命令集。其中{CR}{LF}对应
 * 的是字符格式定义的"\r""\n" ，十六进制为：0x0D，0x0A 即 ASCII 中的回车符和换行符，
 * 命令中{CR}{LF}作为一个分隔符和结束符使用。 

 * 芯片返回基本格式： 
 * 返回参数格式：<参数><{CR}{LF}><OK><{CR}{LF}> 
 * 正确状态返回：<OK><{CR}{LF}> 
 * 错误状态返回：<{CR}{LF}><ERR:><错误码><{CR}{LF}> 
 * 说明：错误码是两个ASCII字符组成的一个 HEX形式，如错误码为字符"01"即表示十六进制的0x01
 */

/* bluetooth AT instruction */

/* 进入AT配置 */
#define BT_ENTER_AT	"AT...\r\n"

/* 复位芯片 */
#define BT_RESET	"AT+RESET\r\n"

/* 获取芯片版本号 */
#define BT_VER		"AT+VER\r\n"

/* 开机语 */
#define BT_GET_OPENING_LANGUAGE	"AT+HELLO?\r\n"
#define BT_SET_OPENING_LANGUAGE	"AT+HELLO=%s\r\n"

/* 重置所有参数 */
#define BT_RELOAD	"AT+RELOAD\r\n"

/* 显示信息 */
#define BT_SHOW		"AT+SHOW\r\n"

/* 保存当前参数 */
#define BT_SAVE		"AT+SAVE\r\n"

/* 退出AT配置 */
#define BT_EXIT_AT	"AT+EXIT\r\n"

/* GPIO设置 */
#define BT_GET_GPIO	"AT+GPIO?\r\n"
#define BT_SET_GPIO	"AT+GPIO%d=%d\r\n"

/* GPIO输出初值设置 */
#define BT_GET_INITIO_GPIO	"AT+INITIO?\r\n"
#define BT_SET_INITIO_GPIO	"AT+INITIO=%d\r\n"

/* 串口设置获取指令 */
#define BT_GET_UART	"AT+UART?\r\n"

/* 串口设置指令:AT+UART=<波特率>,<数据位>,<停止位>,<校验位>,<超时时间>{CR}{LF} */
#define BT_SET_UART	"AT+UART=%d,%d,%d,%d,%d\r\n"

/* MAC地址获取与设置 */
#define BT_GET_MAC	"AT+MAC?\r\n"
#define BT_SET_MAC	"AT+MAC=%02x:%02x:%02x:%02x:%02x:%02x\r\n"

/* 发射功率获取与设置 */
#define BT_GET_TPL	"AT+TPL?\r\n"
#define BT_SET_TPL	"AT+TPL=%x\r\n"

/*
 * 查询蓝牙状态 
 *
 * 广播模式					主机模式			从机模式 
 * 状态码	含义			状态码  含义		状态码  含义 
 * 00		未初始化		00		未初始化	00		未初始化 
 * 01		设备初始化完成  01		扫描		01		设备初始化完成
 * 02		广播			02		连接中		02		广播 
 * 							03		连接成功	03		准备广播状态
 * 							04		断开连接中  04		连接超时 
 * 												05		连接成功 
 * 07  错误										07		错误 
 */
#define BT_BLESTA	"AT+BLESTA?\r\n"

/* 断开连接 */
#define BT_DISCONN	"AT+DISCONN\r\n"

/* 获取蓝牙工作模式 */
#define	BT_GET_BLEMODE	"AT+BLEMODE?\r\n"
#define MODE_BROADCAST	0
#define MODE_MASTER		1
#define MODE_SLAVE		2

/*
 * 设置模式的参数x为：0(广播模式) 、1(主机模式) 、2(设备模式)
 * 命令接收后保存该配置参数，在下一次重启才执行
 */
#define BT_SET_BLEMODE	"AT+BLEMODE=%x\r\n"

/* 获取当前连接MAC地址 */
#define BT_CCADD		"AT+CCADD?\r\n"

/* 芯片名称获取与设置 */
#define BT_GET_NAME		"AT+NAME?\r\n"
#define BT_SET_NAME		"AT+NAME=%s\r\n"

/* 密码使能 */
#define BT_GET_PNAME	"AT+PNAME?\r\n"
#define BT_SET_PNAME	"AT+PNAME=%s\r\n"	/* ON or OFF */

/* 密码设置 */
#define BT_GET_PASS		"AT+PASS?\r\n"
#define BT_SET_PASS		"AT+PASS=%d\r\n"

/* 设备信息的系统ID */
#define BT_SYSID		"AT+SYSID?\r\n"

/* 设备信息的芯片名称 */
#define	BT_GET_MODNAME	"AT+MODNAME?\r\n"
#define BT_SET_MODNAME	"At+MODNAME=%s\r\n"

/* 设备信息的序列号 */
#define BT_GET_SERINUM	"AT+SERINUM?\r\n"
#define BT_SET_SERINUM	"AT+SERINUM=%s\r\n"

/* 设备固件版本 */
#define BT_GET_FIRMREV	"AT+FIRMREV?\r\n"
#define BT_SET_FIRMREV	"AT+FIRMREV=%s\r\n"

/* 设备硬件版本 */
#define BT_GET_HARDREV	"AT+HARDREV?\r\n"
#define BT_SET_HARDREV	"AT+HARDREV=%s\r\n"

/* 设备软件版本 */
#define BT_GET_SOFTREV	"AT+SOFTREV?\r\n"
#define BT_SET_SOFTREV	"AT+SOFTREV=%s\r\n"

/* 厂商名称 */
#define BT_GET_MANUNAME	"AT+MANUNAME?\r\n"
#define BT_SET_NANUNAME	"AT+MANUNAME=%s\r\n"

/* PNP ID */
#define BT_GET_PNPID	"AT+PNPID?\r\n"
#define BT_SET_PNPID	"AT+PNPID=%s\r\n"

/* 广播使能控制 */
#define BT_GET_ADVEN	"AT+ADVEN?\r\n"
#define BT_SET_ADVEN	"AT+ADVEN=%s\r\n"	/* ON or OFF */

/* 广播数据 */
#define BT_GET_ADVDAT	"At+ADVDAT?\r\n"
#define BT_SET_ADVDAT	"AT+ADVDAT=%s\r\n"

/* 序号连接 */
#define BT_LINK			"AT+LINK=%d,%d\r\n"	/* sn, password */

/* 直接连接 */
#define BT_CONN			"AT+CONN=%02x:%02x:%02x:%02x:%02x:%02x,%s\r\n"	/* mac and password */

/* 主机扫描命令 */
#define BT_SCAN			"AT+SCAN=%s\r\n"	/* ON of OFF */

/* 默认连接参数 */
#define BT_GET_CONADD	"AT+CONADD?\r\n"
#define BT_SET_CONADD	"AT+CONADD=%02x:%02x:%02x:%02x:%02x:%02x,%s\r\n"	/* mac and password */

/* 清空默认连接参数 */
#define BT_CLRCONADD	"AT+CLRCONADD\r\n"

/* 读取RSSI */
#define BT_RSSI			"AT+RSSI=%s,%d\r\n"	/* %s:ON or OFF, %d:parameter(是循环读取 RSSI 的周期，单位是毫秒. 0:单次读取) */

/* 读取ADC值 */
#define BT_ADC			"AT+ADC?\r\n"

/* 设置芯片睡眠模式 */
#define BT_GET_SLEEP	"AT+SLEEP?\r\n"
#define BT_SET_SLEEP	"AT+SLEEP=%d\r\n"	/* 0(不进入低功耗) 、1(睡眠模式) 、2(掉电模式)*/

/* 读取芯片电源电压 */
#define BT_BAT			"AT+BAT?\r\n"

/* 主机扫描显示从机电压 */
#define BT_GET_BDSP		"AT+BDSP?\r\n"
#define BT_SET_BDSP		"AT+BDSP=%s\r\n"	/* ON of OFF */

/* 蓝牙配置接口控制 */
#define BT_GET_BLECFGEN		"AT+BLECFGEN?\r\n"
#define BT_SET_BLECFGEN		"AT+BLECFGEN=%d\r\n"	/* 0:关闭 or 1:打开 */

/* 广播通道设置 */
#define BT_GET_BCCH			"AT+BCCH?\r\n"
#define BT_SET_BCCH			"AT+BCCH=%d\r\n"

/* 广播间隔设置 */
#define BT_GET_ADVINTER		"AT+ADVINTER?\r\n"
#define BT_SET_ADVINTER		"AT+ADVINTER=%d\r\n"

/* 连接间隔设置 */
#define BT_GET_CONNINTER	"AT+CONNINTER?\r\n"
#define BT_SET_CONNINTER	"AT+CONNINTER=%d-%d\r\n"

/* 内部32K时钟校准设置 */
#define BT_GET_LSICALI		"AT+LSICALI?\r\n"
#define BT_SET_LSICALI		"AT+LSICALI=%d,%d,%d\r\n"	/* <校准模式>,<温度差阈值>,<定时时间> */

/* RF 校准设置 */
#define BT_GET_RFCALI		"AT+RFCALI?\r\n"
#define BT_SET_RFCALI		"AT+RFCALI=%d,%d,%d\r\n"	/* <校准模式>,<温度差阈值>,<定时时间> */

/* TNOW引脚功能设置 */
#define BT_GET_TONW			"AT+TNOW?\r\n"
#define BT_SET_TONW			"AT+TNOW=%d,%d\r\n"			/* <TNOW使能>,<极性选择> */

/* BLESTA引脚功能设置 */
#define BT_GET_BSTA			"AT+BSTA?\r\n"
#define BT_SET_BSTA			"AT+BSTA=%d,%d\r\n"			/* <BLESTA引脚使能>,<极性选择> */

/* 流控功能设置 */
#define BT_GET_AFEC			"AT+AFEC?\r\n"
#define BT_SET_AFEC			"AT+AFEC=%d,%d,%d\r\n"		/* <流控开启状态>,<DTR引脚输出电平>,<RTS 引脚输出电平> */

/* 设置GPIO功能启用 */
#define BT_GET_IOEN			"AT+IOEN?\r\n"
#define BT_SET_IOEN			"AT+IOEN=%s\r\n"












unsigned char bluetooth_at_mode(void);
unsigned char bluetooth_chip_version(void);
unsigned char bluetooth_set_uart(void);
unsigned char bluetooth_get_serinum(void);
unsigned char bluetooth_get_sysid(void);
unsigned char bluetooth_get_mac(void);
unsigned char bluetooth_set_mac(char aa, char bb);
int BluetoothGetAdevnStatus(void);
int BluetoothBroadcasEnable(void);
int BluetoothBroadcastData();
int BluetoothGetBroadcastChannel(void);
int BluetoothSetBroadcastChannel(void);
int BluetoothGetWorkMode(void);
int BluetoothSetWorkMode(int sMode);
int BluetoothChipReset(void);

/* broadcast mode */
int BluetoothBroadcastMode(char mode);


#ifdef __cplusplus
}
#endif

#endif /* __BLUETOOTH_H__ */

